home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / acp3.00 / semis.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-02-18  |  3.3 KB  |  117 lines

  1. #include <exec/exec.h>
  2. #include "semis.h"
  3. void ShutDownSemis(void);
  4. #define CHAT_ENTER 5
  5. #define CHAT_EXIT  4
  6. #define CHAT_IDLE  3
  7. #define CHAT_TEXT  2
  8. #define CHAT_NONE  1
  9. #define CHAT_NTXT  6
  10.  
  11. struct MultiPort *SemiNodes;
  12. struct SinglePort *SingleNode;
  13. char MultiName[] = "AEMulti";
  14. char SingleName[] = "AEStat ";
  15. void CreateSemaphores(void);
  16. void InitSemaSemiNodes(struct MultiPort *s);
  17. void CreateSemaphores(void)
  18. {
  19.   Forbid();
  20.   if(!(SemiNodes=(struct MultiPort *)FindSemaphore(MultiName)))
  21.   {
  22.        
  23.        SemiNodes=(struct MultiPort *)AllocMem(sizeof(struct MultiPort),MEMF_PUBLIC|MEMF_CLEAR);
  24.        strcpy(SemiNodes->SemiName,MultiName);
  25.        SemiNodes->semi.ss_Link.ln_Pri=0;
  26.        SemiNodes->semi.ss_Link.ln_Name=SemiNodes->SemiName;
  27.        NewList(&SemiNodes->sl_List);
  28.         InitSemaSemiNodes(SemiNodes);
  29.        InitSemaphore((struct SignalSemaphore *)SemiNodes);
  30.        //AddSemaphore((struct SignalSemaphore *)SemiNodes);
  31.   }
  32.   else
  33.   {
  34.      ObtainSemaphore(SemiNodes);
  35.      InitSemaSemiNodes(SemiNodes);
  36.      ReleaseSemaphore(SemiNodes);
  37.   }
  38.   Permit();
  39. }
  40.  
  41. void InitSemaSemiNodes(struct MultiPort *s)
  42. {
  43.   register int i=0;
  44.   register int j;
  45.   while(i<9)
  46.   {
  47.      strcpy(s->MyNode[i].Handle,"");
  48.      for(j=0;j<9;j++)
  49.      {
  50.        s->MyNode[i].Stats[j].info='\0';
  51.        s->MyNode[i].Stats[j].Status=CHAT_NONE;
  52.      }
  53.      
  54.      s->MyNode[i].t=NULL;
  55.      s->MyNode[i].tasksignal=NULL;
  56.      s->MyNode[i].StartTime=NULL;
  57.      s->MyNode[i].Private=FALSE;
  58.      s->MyNode[i].Channel=0;
  59.      s->MyNode[i].ChatColor=i+1;
  60.      SingleName[6]='0'+i;
  61.       if(!(SingleNode=(struct SinglePort *)FindSemaphore(SingleName)))
  62.       {
  63.        
  64.        SingleNode=(struct SinglePort *)AllocMem(sizeof(struct SinglePort),MEMF_PUBLIC|MEMF_CLEAR);
  65.        strcpy(SingleNode->SemiName,SingleName);
  66.        SingleNode->semi.ss_Link.ln_Pri=0;
  67.        SingleNode->semi.ss_Link.ln_Name=SingleNode->SemiName;
  68.        SingleNode->MultiCom=(APTR)s;
  69.        strcpy(SingleNode->Handle,"");
  70.        strcpy(SingleNode->Location,"");
  71.        strcpy(SingleNode->Misc1,"");
  72.        strcpy(SingleNode->Misc2,"");
  73.        SingleNode->Status=-1;
  74.        NewList(&SingleNode->sl_List);
  75.        InitSemaphore((struct SignalSemaphore *)SingleNode);
  76.        //AddSemaphore((struct SignalSemaphore *)SingleNode);
  77.  
  78.        }
  79.        else
  80.        {
  81.           ObtainSemaphore(SingleNode);
  82.                 SingleNode->MultiCom=(APTR)s;
  83.                 strcpy(SingleNode->Handle,"");
  84.                 strcpy(SingleNode->Location,"");
  85.                 strcpy(SingleNode->Misc1,"");
  86.                 strcpy(SingleNode->Misc2,"");
  87.                 SingleNode->Status=-1;
  88.           ReleaseSemaphore(SingleNode);
  89.        }
  90.      s->MyNode[i].s=SingleNode;
  91.      if(s->MyNode[i].ChatColor>7)
  92.      {
  93.        s->MyNode[i].ChatColor -=6;
  94.      }
  95.      i++;
  96.   }
  97. }
  98.  
  99. void ShutDownSemis(void)
  100. {
  101.    register int i;
  102.    struct SinglePort *p;
  103.    Forbid();
  104.    //RemSemaphore((struct SignalSemaphore *)SemiNodes);
  105.    ObtainSemaphore((struct SignalSemaphore *)SemiNodes);
  106.    for(i=0;i<9;i++)
  107.    {
  108.       p=(struct SinglePort *)SemiNodes->MyNode[i].s;
  109.       //RemSemaphore((struct SignalSemaphore *)p);
  110.       ObtainSemaphore((struct SignalSemaphore *)p);
  111.       ReleaseSemaphore((struct SignalSemaphore *)p);
  112.       FreeMem((struct SinglePort *)p,sizeof(struct SinglePort));
  113.    }
  114.    ReleaseSemaphore((struct SignalSemaphore *)SemiNodes);
  115.    FreeMem((struct MultiNode *)SemiNodes);
  116.    Permit();
  117. }